package tree

import "fmt"

type Node struct {
	Value       int
	Left, Right *Node
}
// 指接收者
func (node Node) Print() {
	fmt.Print(node.Value, " ")
}
// 指针接收者
func (node *Node) SetValue(value int) {
	if node == nil {
		fmt.Println("Setting Value to nil node. Ignored.")
		return
	}
	node.Value = value
}
// 自己定义构造，工厂函数
func CreateNode(value int) *Node {
	return &Node{Value: value}
}
func defineNode() {
	var root Node
	root = Node{Value: 3}
	root.Left = &Node{}
	root.Right = &Node{5, nil, nil}
	root.Right.Left = new(Node)
	nodes := []Node{
		{Value: 3},
		{},
		{6, nil, &root},
	}
	fmt.Println(nodes)

	root.Left.Right = CreateNode(2);

	root.Print()

	root.Right.Left.SetValue(3)
	root.Right.Left.Print()

	pRoot := &root
	pRoot.Print()
	pRoot.SetValue(200)

	var nRoot  *Node
	nRoot.SetValue(200) // nRoot是个nil也可以调用方法，只不过传进去的参数是个空，在其他语言会报NullPointException


}